﻿#pragma once

#include "Cadena.h"
#include "Iterable.h"
#include "TipoRetorno.h"
#include "Tupla.h"

#include "IPais.h"
#include "ICiudad.h"
#include "IRecurso.h"

class ISistema abstract
{
public:
	virtual ~ISistema(){}

	//// Obligatorio 1
	virtual TipoRetorno AltaPais(Cadena nombrePais) abstract;
	virtual TipoRetorno AltaCiudad(Cadena nombrePais, Cadena nombreCiudad, bool esCapital) abstract;
	virtual TipoRetorno AltaRecurso(Cadena nombrePais, Cadena nombreCiudad, Cadena recurso, int puntaje, int cantidad, int valor) abstract;
	virtual Tupla<TipoRetorno, Puntero<Iterador<pPais>>> ImprimirJuego() const abstract;
	virtual Tupla<TipoRetorno, pRecurso> RecursoMasValioso(Cadena nombrePais, Cadena nombreCiudad) abstract;
	virtual Tupla<TipoRetorno, Puntero<Iterador<Tupla<pPais,pCiudad>>>> CiudadesRecurso(Cadena recurso) const abstract;

	//// Tipo 1
	virtual TipoRetorno AltaCamino(Cadena nombrePaisO, Cadena nombreCiudadO, Cadena nombrePaisD, Cadena nombreCiudadD, int distancia, int costo) abstract;
	virtual TipoRetorno ListadoMapa(Cadena nombrePais, Cadena nombreCiudad) const abstract;
	virtual TipoRetorno Importar2(Cadena nombrePais, Cadena nombreCiudad, Cadena nombreRecurso, int cantidad) abstract;
	virtual Tupla<TipoRetorno, Puntero<Iterador<Tupla<pPais,pCiudad>>>> RutaMasRapida(Cadena nombrePaisO, Cadena nombreCiudadO, Cadena nombrePaisD, Cadena nombreCiudadD) const abstract;
	virtual Tupla<TipoRetorno, Puntero<Iterador<pRecurso>>> SeleccionRecurso(Cadena nombrePais, Cadena nombreCiudad, int k) const abstract;

	//// Tipo 2
	virtual Tupla<TipoRetorno, bool> Conectividad() const abstract;
	virtual TipoRetorno ConexionBarata(Puntero<Iterador<Tupla<pPais,pCiudad>>> ciudades) const abstract;
	virtual Tupla<TipoRetorno, Puntero<Iterador<Tupla<pPais,pCiudad>>>> Recolectar(Cadena nombrePais, Cadena nombreCiudad, Cadena nombreRecurso, int k) const abstract;
	virtual Tupla<TipoRetorno, Puntero<Iterador<Puntero<Iterador<Tupla<pPais,pCiudad>>>>>> RutasEntre2Paises(Cadena nombrePaisO, Cadena nombrePaisD) const abstract;

	//// Opcionales
	virtual Tupla<TipoRetorno, int> ValorMapa() const abstract;
};
